package com.spring.demo4.factory;

import com.spring.demo4.factory.Joinpoint.MyMethodInvocation;
import org.aopalliance.intercept.Interceptor;

/**
 * MethodInterceptor: 方法拦截器，这个接口最强大，可以实现MethodBeforeAdvice、AfterReturningAdvice和ThrowsAdvice的通知，
 * 这3种通知最终都通过适配模式将其转换为MethodInterceptor方式去执行
 * <br>
 * Aop内部会给目标对象创建一个代理，代理对象中会放入这些 MethodInterceptor 会组成一个方法调用
 * 链，当调用代理对象的方法的时候，会按顺序执行这些方法调用链，一个个执行，最后会通过反射再去
 * 调用目标方法，进而对目标方法进行增强
 * <br>
 * 通知包装器: 负责将各种非MethodInterceptor类型的通知(Advice)包装为MethodInterceptor类型
 * 3个包装器类:
 * 1.MethodBeforeAdviceInterceptor
 * 2.AfterReturningAdviceInterceptor
 * 3.ThrowsAdviceInterceptor
 *
 * @author vhans
 */
public interface MyMethodInterceptor extends Interceptor {

    /**
     * 拦截目标方法的执行，可以在这个方法内部实现需要增强的逻辑，以及主动调用目标方法
     */
    Object invoke(MyMethodInvocation invocation) throws Throwable;
}
